import axios from "axios";
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';

// 扩展AxiosRequestConfig类型
declare module 'axios' {
  export interface AxiosRequestConfig {
    cache?: boolean;
    __fromCache?: boolean;
  }
}

// 简单的请求缓存
interface CacheItem {
  data: any;
  expiry: number;
}

class RequestCache {
  private cache: Map<string, CacheItem> = new Map();
  private readonly DEFAULT_EXPIRY = 60 * 1000; // 默认缓存1分钟

  set(key: string, data: any, expiryMs: number = this.DEFAULT_EXPIRY): void {
    const expiry = Date.now() + expiryMs;
    this.cache.set(key, { data, expiry });
  }

  get(key: string): any | null {
    const item = this.cache.get(key);
    if (!item) return null;
    
    // 检查是否过期
    if (Date.now() > item.expiry) {
      this.cache.delete(key);
      return null;
    }
    
    return item.data;
  }
  
  // 生成缓存键
  generateKey(config: AxiosRequestConfig): string {
    const { method, url, params, data } = config;
    return `${method}_${url}_${JSON.stringify(params || {})}_${JSON.stringify(data || {})}`;
  }
  
  // 清除所有缓存
  clear(): void {
    this.cache.clear();
  }
}

// 创建缓存实例
const requestCache = new RequestCache();

// 创建axios实例
const http: AxiosInstance = axios.create({   
  //baseURL: 'http://121.41.33.151:7777/',
  baseURL: 'http://localhost:5029/',
  timeout: 10000,
});

// 请求拦截器
http.interceptors.request.use(
  (config) => {
    // 如果路径以 / 开头，去掉这个斜杠，避免baseURL失效
    if (config.url?.startsWith('/')) {
      config.url = config.url.substring(1);
    }
    
    // 仅对GET请求应用缓存
    if (config.method?.toLowerCase() === 'get' && config.cache !== false) {
      const cacheKey = requestCache.generateKey(config);
      const cachedResponse = requestCache.get(cacheKey);
      
      if (cachedResponse) {
        console.log('从缓存获取数据:', config.url);
        // 创建一个已解决的promise，使用缓存数据
        return Promise.resolve({
          ...config,
          adapter: () => Promise.resolve({
            data: cachedResponse,
            status: 200,
            statusText: 'OK',
            headers: {},
            config,
          }),
          // 标记为已处理缓存，避免响应拦截器重复缓存
          __fromCache: true,
        });
      }
    }
    
    // 可以在这里添加token等认证信息
    // if (token) {
    //   config.headers['Authorization'] = `Bearer ${token}`;
    // }
    
    return config;
  },
  (error) => {
    console.error('请求拦截器错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
http.interceptors.response.use(
  (response) => {
    // 对GET请求结果进行缓存
    if (response.config.method?.toLowerCase() === 'get' && 
        !response.config.__fromCache && 
        response.status === 200) {
      const cacheKey = requestCache.generateKey(response.config);
      requestCache.set(cacheKey, response.data);
    }
    return response;
  },
  (error) => {
    if (error.response) {
      // 请求已发送但服务器返回状态码超出2xx范围
      console.error('响应错误状态码:', error.response.status);
      console.error('响应错误数据:', error.response.data);
    } else if (error.request) {
      // 请求已发送但没有收到响应
      console.error('未收到响应:', error.request);
    } else {
      // 在设置请求时发生错误
      console.error('请求错误:', error.message);
    }
    return Promise.reject(error);
  }
);

// 提供清除缓存的方法
const clearCache = (): void => {
  requestCache.clear();
};

export { clearCache };
export default http;
